package com.cskaoyan.javase.oop1._11static._1basic;

/**
 * 引例
 * 宠物公司新进了一批同样颜色的猫，创建一个类描述这批宠物
 * 注：创建该类时，给出一个静态成员变量和一个静态成员方法。
 *
 * static修饰的成员，称之为静态成员，包括静态成员变量和静态成员方法。
 * 静态成员(static member)的访问并不依赖于创建对象，可以直接通过类名访问
 * 其原因在于：
 * 随着类加载完毕，静态成员就存在，并且能够使用了！
 *      1.静态成员变量在类加载过程中完成默认初始化具有默认值，然后进行一些其它赋值，类加载结束就可以访问了。
 *      静态成员变量的赋值也是先进行默认初始化，然后考虑其它赋值手段。
 *
 *      静态成员变量的赋值,在类加载过程中赋值手段,目前有两种:
 *      a.默认初始化,具有默认值
 *      b.显式赋值
 *      默认初始化永远最先进行,然后执行显式赋值
 *
 *      2.静态成员方法的二进制指令集合在类加载过程也准备完毕，可以调用了。
 *      这其实就是一种方法的调用机制.
 *
 *
 * 思考:
 *      1.既然静态成员是在类加载过程中完成初始化创建的,那么访问类的静态成员,不类加载这个类可以吗?
 *      显然是不可以的,所以一旦访问该类的静态成员,就会优先进行该类的类加载
 *      这也是一种类加载的时机.
 *      总结目前所有的类加载时机:
 *          a.启动main方法
 *          b.new对象
 *          c.访问类的静态成员
 *
 *
 *      2.某个类的类加载在一次程序执行期间,最多只有一次,所以某个类的静态成员变量有几份?
 *      一份,是唯一的
 *      所以静态成员变量属于类,且全局唯一
 *      根据它的这种特点,也被称之为"全局变量"
 *
 *      3.类加载和创建对象的过程,类加载肯定在前,创建对象必然在后
 *      所以静态成员在内存中的出现时间比普通成员,要早.
 *
 * 一定要注意：
 * 静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 * 静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 * 静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 * 既然是方法，肯定遵循不调用就不执行的原则！
 *
 * @since 10:47
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(Cat.color);
        Cat.catchMouse();
    }
}

class Cat {
    static String color = "橘色";
    double price;

    public void eat() {
        System.out.println("吃猫粮");
    }

    public static void catchMouse() {
        System.out.println("抓老鼠!");
    }
}
